package day17.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class FieldDemo {
    public static void main(String[] args) {
        Class<?> c=Point.class;
        Point p=null;
        try {
            p=(Point) c.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        //通过class实例可以获取所有的field对象[包含私有的]
        Field[] fields = c.getDeclaredFields();

        for (Field f : fields) {
            //System.out.println(f);//修饰符 返回类型 属性名称
            //通过Field中提供的API来一一获取上面的这些信息

            //获取修饰符
            //private - 2
            //protected - 4
            //默认的 - 0
            //公共的 - 1
            int m = f.getModifiers();
            //System.out.println(m);
            System.out.print(Modifier.toString(m)+"\t");

            //获取字段的返回类型
            Class<?> type = f.getType();
            //System.out.println(type);
            //输出类型的简称即可
            System.out.print(type.getSimpleName()+"\t");

            //获取字段的名称
            System.out.println(f.getName());
        }

        System.out.println("================");
        //根据指定的属性的名称来获取该属性对应的Field对象
        try {
            Field xField = c.getDeclaredField("x");
           System.out.println("xField:"+xField);

            //获取反射的技术来给属性设置值.
            //在操作私有的字段的时候,需要提前设置为可访问
            xField.setAccessible(true);
            xField.set(p,10);//p.x = 10

            System.out.println(p);

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {//非法访问
            e.printStackTrace();
        }

    }
}
